/*
 * Fichier: PresentationPane.java
 * Crée le: 15 septembre 2007.
 * Modifié: 14 février 2009.
 * Auteurs: Sébastien ESTIENNE.
 * SiteWeb: http://www.prog-info.org/
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.OF
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */

package javaexos.gui;



import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;

import javaexos.controller.PresentationController;
import javaexos.gui.common.GLinkLabel;
import javaexos.gui.common.LinkEvent;
import javaexos.gui.common.LinkListener;
import javaexos.tools.Constants;
import javaexos.view.PresentationView;

import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;



/**
 * <p>Panneau d'informations de la présentation.</p>
 * @author Sébastien ESTIENNE.
 */
public class PresentationPane extends JPanel implements PresentationView, LinkListener
{
   /**
    * <p>Serial version UID.</p>
    */
   private static final long serialVersionUID = 1L;

   /** Le contrôleur. */
   @SuppressWarnings("unused")
   private PresentationController controller;

   /** Etiquette contenant le logo de l'application. */
   private JLabel logoLabel;

   /** Etiquette contenant l'auteur. */
   private JLabel authorLabel;

   /** Etiquette indiquant la version. */
   private JLabel versionLabel;

   /** Etiquette référançant l'espace web perso sur developpez.com. */
   private GLinkLabel developpezLinkLabel;

   /** Etiquette référançant le site web prog-info.org. */
   private GLinkLabel proginfoLinkLabel;

   /** Panneau contenant le logo et les références. */
   private JPanel mainPanel;

   /** Panneau contenant des informations. */
   private JPanel informationPanel;


   /**
    * <p>Construit le panneau pour la présentation.</p>
    * @param controller Le contrôleur associé.
    */
   public PresentationPane(PresentationController controller)
   {
      super();

      // Initialisation.
      this.controller = controller;

      // Initialisation des composants.
      initComponents();
   }


   /**
    * <p>Initialise le panneau de présentation.</p>
    */
   private void initComponents()
   {
      // Propriétés du panneau.
      setLayout(new BorderLayout(5, 5));
      setBorder(new EmptyBorder(3, 3, 3, 3));
      setBackground(Color.WHITE);

      // Logo.
      this.logoLabel = new JLabel("");
      this.logoLabel.setIcon(new ImageIcon(getClass().getResource(Constants.LOGO_PATH)));
      this.logoLabel.setHorizontalAlignment(SwingConstants.CENTER);

      // Référence developpez.com.
      this.developpezLinkLabel = new GLinkLabel(Constants.DVPZ_WEB_SITE_NAME,
            Constants.DVPZ_WEB_SITE_ADDRESS);
      this.developpezLinkLabel.setHorizontalAlignment(SwingConstants.CENTER);
      this.developpezLinkLabel.addLinkListener(this);

      // Référence prog-info.org.
      this.proginfoLinkLabel = new GLinkLabel(Constants.PI_WEB_SITE_NAME,
            Constants.PI_WEB_SITE_ADDRESS);
      this.proginfoLinkLabel.setHorizontalAlignment(SwingConstants.CENTER);
      this.proginfoLinkLabel.addLinkListener(this);

      // Panneau principal.
      this.mainPanel = new JPanel();
      this.mainPanel.setLayout(new GridBagLayout());
      this.mainPanel.setBackground(Color.WHITE);
      GridBagConstraints gbc = new GridBagConstraints();
      gbc.gridx = 0;
      gbc.gridy = 0;
      this.mainPanel.add(this.logoLabel, gbc);
      gbc.gridy = 1;
      this.mainPanel.add(this.developpezLinkLabel, gbc);
      gbc.gridy = 2;
      this.mainPanel.add(this.proginfoLinkLabel, gbc);

      // Auteur.
      this.authorLabel = new JLabel(Constants.AUTHOR);
      this.authorLabel.setHorizontalAlignment(SwingConstants.RIGHT);

      // Version.
      this.versionLabel = new JLabel("version " + Constants.VERSION);
      this.versionLabel.setHorizontalAlignment(SwingConstants.CENTER);

      // Panneau des références.
      this.informationPanel = new JPanel(new GridLayout(2, 1, 0, 0));
      this.informationPanel.setBackground(Color.WHITE);
      this.informationPanel.add(this.authorLabel);
      this.informationPanel.add(this.versionLabel);

      // Ajoute les panneaux.
      add(this.mainPanel, BorderLayout.CENTER);
      add(this.informationPanel, BorderLayout.SOUTH);
   }


   /**
    * <p>Invoqué quand un lien est parcouru.</p>
    * @param e Evénement indiquant qu'un lien a été parcouru.
    */
   public void linkBrowsed(LinkEvent e)
   {
      switch(e.getStatus())
      {
      case SUCCESS:
         // Ne rien faire.
         break;
      case UNSUPPORTED_LAUNCH:
         JOptionPane.showMessageDialog(this, e.getLink()
               + "\nLancement d'applications non supporté.", "Erreur", JOptionPane.ERROR_MESSAGE);
         break;
      case UNSUPPORTED_BROWSER:
         JOptionPane.showMessageDialog(this, e.getLink()
               + "\nLancement du navigateur non supporté.", "Erreur", JOptionPane.ERROR_MESSAGE);
         break;
      case UNREACHABLE_BROWSER:
         JOptionPane.showMessageDialog(this, e.getLink()
               + "\nImpossible d'ouvrir le navigateur par défaut.", "Erreur",
               JOptionPane.ERROR_MESSAGE);
         break;
      case INVALID_LINK:
         JOptionPane.showMessageDialog(this, e.getLink() + "\nL'adresse du lien est incorrecte.",
               "Erreur", JOptionPane.ERROR_MESSAGE);
         break;
      default:
         break;
      }
   }
}
